package com.qf.service.impl;

import com.qf.dao.UserDao;
import com.qf.pojo.User;
import com.qf.service.UserService;
import com.qf.test.OrderDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @version v1.0.0
 * @Description:
 * @author: 姜红凯
 * @date: 2022.02.10
 * @since 1.0
 */

/**
 * @Component: 标记在类上（类注解）， 可以通过组件扫描创建bean对象
 *          value属性可以指定对象在容器中的名称，相当于bean标签的id属性
 * @Componect: 衍生了三个子注解, 作用 跟 @Component一样
 *       @Controller 一般用于 控制层（controller）
 *       @Service  一般用于业务层  （service）
 *       @Repository 一般用于持久层 （dao）， 一般不用
 *
 *
 * @AutoWired:  自动装配， 自动从ioc容器中找到相同类型的对象，赋值给属性
 *          如果ioc容器中有多个相同类型的对象，那么会根据属性名查找对象;
 *          如果根据属性名不能找到对象，则抛出类型不唯一的异常
 *          如果有多个类型相同对象，可以使用@Qulifier注解指定对象名称
 *          @Qulifier  只能跟@Autowired配合使用
 *      @AutoWired：默认根据类型查询对象
 *      @AutoWired：由spring框架提供
 *
 * @Resource
 *      自动装配，自动从ioc容器中找到相同类型的对象，赋值给属性
 *     @Resource 默认按照名称查找对象， 如果名称找不到，则按照类型查找对象
 *     @Resource： 由jdk提供
 *
 * @Transactional:  事务注解配置
 *      需要在配置文件中添加 开启事务注解配置
 *      注解用在类上，类中所有方法开启事务
 *      注解用在方法上，该方法开启事务
 */
@Transactional(isolation = Isolation.DEFAULT,
        propagation = Propagation.REQUIRED,
        readOnly = false ,
        timeout = -1,
        rollbackFor = Exception.class)
@Component("userService")
public class UserServiceImpl implements UserService {

//    @Autowired
//    @Qualifier("orderDaoImpl1")
    @Resource(name="orderDaoImpl1")
    OrderDao orderDao;


    @Autowired
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }


    @Transactional(isolation = Isolation.DEFAULT,
            propagation = Propagation.SUPPORTS,
            readOnly = true,
            timeout = -1,
            rollbackFor = Exception.class)
    @Override
    public List<User> findUserList() {
        System.out.println("======="+orderDao);
        return userDao.queryAll();
    }


    /**
     * 从 from 转到  to  ， 转2块
     *
     * @param from
     * @param to
     */

    @Override
    public void transfer(String from, String to) {

            User fromUser =  userDao.findByUsername(from);
            User toUser =  userDao.findByUsername(to);

            //更新余额
            fromUser.setMoney(fromUser.getMoney() -2);
            toUser.setMoney(toUser.getMoney() + 2);

            //更新数据库
            userDao.update(fromUser);

            System.out.println(1/0);

            userDao.update(toUser);

    }
}
